﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms.GestionPedidos
{
    public partial class FrmNotaCredito : Form
    {
        int clienteId = 0;
        DisancoEntities context;
        decimal subtotal;
        decimal descuento;
        decimal iva;
        decimal subtotcondesc;
        string tipoc;
        int autorizacionId;
        long numeroNC;
        int idvta;
        DateTime fechaActual;
        public static decimal incremento;
      
        public static bool notacred;
        public static bool notacredAd;
        public static bool NC;
        public static bool NCad;
        NotasCredito NotaCredPrint;
        NotasCreditoAd NotaCredAdPrint;
        Int64 numeroNCAdic;
        Int64 NumeroComprPrint;
        String TipoComprPrint;

        private Font miniprintFont = new Font("Calibri", 7);
        private Font printFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);
        private Font printFontTit = new Font("Calibri", 12);
        private Font printFontTotal = new Font("Calibri", 13);

        public FrmNotaCredito(int vtaid,int clienteid, string tipocomp, decimal inc)
        {
            InitializeComponent();
            tipoc = "C"; //Nota de Credito quiere decir la C para guardar en la BD
            int idcli;
            incremento = 0;
            incremento = Convert.ToDecimal(inc / 100);
            //STATUS BAR
            string label = (Convert.ToString(incremento) + " % ");
            labelInc.Text = Convert.ToString(label);

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            notacred = true;
            if (tipocomp == "A" | tipocomp == "B")
            {
                notacredAd = false;
                NC = true;
                NCad = false;
                bool autorizado = buscarAutorizaciones(tipoc);
                idvta = vtaid;
                if (autorizado)
                {
                    idcli = clienteid;
                    BuscarCliente(idcli);
                }
                else
                {
                    MessageBox.Show("No se encontraron autorizaciones validas activas");
                    //this.Close();
                    btnAddArticulo.Enabled = false;
                    btnEliminarArticulo.Enabled = false;
                    btnEmitir.Enabled = false;
                }
            }
            else
                if (tipocomp == "X")
                {
                notacredAd = true;
                NCad = true;
                NC = false;
                numeroNCAdic =  obtenerNumeroNCAdicional();
                idcli = clienteid;
                idvta = vtaid;
                BuscarCliente(idcli);
                txbNotaCreditoNumero.Text = numeroNCAdic.ToString("000000000000");
                }
            validarBotones();
        }
        //Eventos
        private void BuscarCliente(int clienteid)
        {
            Clientes ClienteVta = context.Clientes.FirstOrDefault(cli => cli.cliente_id.Equals(clienteid));
            try
            {
                txtbCliNombre.Text = ClienteVta.cliente_nombre;
                txtbCliDireccion.Text = ClienteVta.cliente_direccion;
                txtbCliLocalidad.Text = ClienteVta.cliente_localidad;
                txtbCliCondiva.Text = ClienteVta.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = ClienteVta.cliente_cuit;

                txtbCliDireccion.ReadOnly = true;
                txtbCliLocalidad.ReadOnly = true;
                txtbCliNombre.ReadOnly = true;
                txtbCliCondiva.ReadOnly = true;
                txtbCliCuit.ReadOnly = true;
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

        private void btnAddArticulo_Click(object sender, EventArgs e)
        {
            agregarArticulo();
        }

        private void btnEliminarArticulo_Click(object sender, EventArgs e)
        {
            EliminarArticulo();

        }
       
        //Funciones
        private void ActualizarStock(int idarticulo, int artcant)
        {
            Articulos Art = context.Articulos.FirstOrDefault(art => art.art_id.Equals(idarticulo));
            Art.art_stock = Art.art_stock + artcant;
        }

        private void agregarArticulo()
        {
            if (dgvListaArt.Rows.Count == Constantes.maximoLineasFactura)
            {
                MessageBox.Show("No se pueden agregar mas articulos a este Presupuesto", "Información", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                frmArticuloVentaBuscar busqueda = new frmArticuloVentaBuscar(dgvListaArt);
                busqueda.Owner = this;
                DialogResult dr = busqueda.ShowDialog();
                validarBotones();
                subtotal = 0;
                calcularTotales();

                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    if (verificarArticulo(busqueda.Articulo))
                    {
                        Articulos art = context.Articulos.FirstOrDefault(a => a.art_id == busqueda.Articulo);
                        int i = dgvListaArt.Rows.Add();
                        dgvListaArt.Rows[i].Cells["art_id"].Value = busqueda.Articulo;
                        dgvListaArt.Rows[i].Cells["art_codigo"].Value = art.art_codigo;
                        dgvListaArt.Rows[i].Cells["art_nombre"].Value = art.art_nombre;
                        dgvListaArt.Rows[i].Cells["cantidad"].Value = busqueda.Cantidad;
                        dgvListaArt.Rows[i].Cells["precio_unitario"].Value = busqueda.PrecioUnitario;
                        dgvListaArt.Rows[i].Cells["oferta_descuento"].Value = busqueda.Bonificacion;
                        dgvListaArt.Rows[i].Cells["precio_bonificado"].Value = Funcion.PrecioBonificado(busqueda.PrecioUnitario, busqueda.Bonificacion);
                        dgvListaArt.Rows[i].Cells["precio_final"].Value = busqueda.PrecioTotal;
                        calcularTotales();
                        validarBotones();
                    }
                    else
                    {
                        MessageBox.Show("El articulo ya fue seleccionado", "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            
        }

        private void EliminarArticulo()
        {
            DialogResult dr = MessageBox.Show("¿Seguro que desea eliminar estos articulos de la lista?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == System.Windows.Forms.DialogResult.Yes)
            {
                foreach (DataGridViewRow fila in dgvListaArt.SelectedRows)
                {
                    dgvListaArt.Rows.Remove(fila);
                }
                subtotal = 0;
                calcularTotales();
                validarBotones();
            }
        }

        private bool verificarArticulo(int idArticulo)
        {
        foreach (DataGridViewRow fila in dgvListaArt.Rows)
        {
            if ((int)fila.Cells["art_id"].Value == idArticulo)
        {
            return false;
        }
        }

    return true;
}

        public void calcularTotales()
        {
            foreach (DataGridViewRow fila in dgvListaArt.Rows)
            {
                subtotal = subtotal + (decimal)fila.Cells["precio_final"].Value;
            }
            decimal subtot2dig = Math.Round(subtotal, 2);
            txbSubTotal.Text = subtot2dig.ToString();
            descuento = numDescuento.Value / 100;
            subtotcondesc = Math.Round((Funcion.SubtotDescuento(subtotal, descuento)), 2);
            txbSubTotDesc.Text = subtotcondesc.ToString("0.00");

            if (NC == true)
            {
                iva = Math.Round((subtotcondesc * (Clases.Constantes.IVA)), 2);
                txbIva.Text = iva.ToString("0.00");
            }
            else 
            {
                iva = 0;
                txbIva.Text = iva.ToString("0.00");
            }
            txbTotal.Text = (subtotcondesc + iva).ToString("0.00");
        }

        private bool buscarAutorizaciones(string tipo)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            foreach (var auth in context.Autorizaciones)
            {
                if (auth.autorizacion_tipo_comp == tipo &&
                    auth.autorizacion_estado &&
                    auth.autorizacion_limite_fecha.Date > DateTime.Now.Date)
                {
                    autorizacionId = auth.autorizacion_id;
                    numeroNC = auth.autorizacion_ultimo_numero + 1;

                    if (numeroNC > auth.autorizacion_limite_max)
                    {
                        MessageBox.Show("No quedan numeros de disponibles para Comprobantes Tipo" + tipo, "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        btnEmitir.Enabled = false;
                        txbNotaCreditoNumero.Enabled = false;
                        return false;
                    }
                    else
                    {
                        txbNotaCreditoNumero.Text = numeroNC.ToString("000000000000");
                       
                        return true;
                    }
                }

            }

            return false;
        } // para comprobantes NC
  
        void validarBotones()
    {
        if (dgvListaArt.Rows.Count == 0)
            btnEliminarArticulo.Enabled = false;
        else
            btnEliminarArticulo.Enabled = true;

        if (dgvListaArt.Rows.Count == 0)
            btnEmitir.Enabled = false;
        else
            btnEmitir.Enabled = true;
    }

        Int64 obtenerNumeroNCAdicional()// para comprobantes NCAdicionales
        {
            if ((context.NotasCreditoAd.Count()) == 0)
                return 1;
            else
                return context.NotasCreditoAd.Max(ncad => ncad.notacredad_nro) + 1;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            notacred = false;
            notacredAd = false;
            this.Close();
        }

        private void numDescuento_ValueChanged(object sender, EventArgs e)
        {
            descuento = numDescuento.Value / 100;
            subtotal = 0;
            calcularTotales();
        }

        private int CheckNumber(long number, string type)
        {
            //Verifica si el numero en cuestion ya fue utilizado anteriormente.
            //Los resultados posibles son:
            //0: Ocurrio un error al buscar los numeros
            //1: El numero no fue ocupado aun
            //2: El numero ya fue ocupado

            try
            {
                using (var context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion))
                {
                    var query = context.NotasCredito.Where(x => x.notacred_nro == number);

                    if (query.Count() > 0)
                        return 2;
                    else
                        return 1;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
                return 0;
            }
        }

        private void txbNotaCreditoNumero_TextChanged(object sender, EventArgs e)
        {
            btnEmitir.Enabled = false;

            if (NC == true)
            {
                txbNotaCreditoNumero.BackColor = SystemColors.Window;
                string textNumber = txbNotaCreditoNumero.Text.Replace(" ", "").Replace("-", "");

                if (textNumber.Length == 12)
                {
                    long longNumber = Convert.ToInt64(textNumber);
                    string factTipo = tipoc;
                    int statusNumber = CheckNumber(longNumber, factTipo);

                    switch (statusNumber)
                    {
                        case 0:
                            txbNotaCreditoNumero.BackColor = Color.Red;
                            break;
                        case 1:
                            txbNotaCreditoNumero.BackColor = Color.LightGreen;
                            btnEmitir.Enabled = true;
                            break;
                        case 2:
                            txbNotaCreditoNumero.BackColor = Color.Red;
                            break;
                    }
                }
            }
            else
            {
                txbNotaCreditoNumero.Enabled = false;
            
            }
        }

        private void btnEmitir_Click(object sender, EventArgs e)
        {
            try
            {
                numeroNC = Convert.ToInt64(txbNotaCreditoNumero.Text.Replace("-", ""));
                fechaActual = DateTime.Now;
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
                bool valido = true; //???
              
                if (valido)
                {
                    if (NCad == true) // Nota credito Adicional
                    {
                        // busco la ventaad relacionada para imprimir el nro de compr
                        VentasAdicionales factad = context.VentasAdicionales.FirstOrDefault(facad => facad.va_id == idvta);
                        NumeroComprPrint = factad.va_nro_comp_ini;
                        TipoComprPrint = "X";

                        //Registrar la nueva nota de credito adicional
                        NotasCreditoAd nuevanotacredad = new NotasCreditoAd();
                        nuevanotacredad.notacredad_fecha = fechaActual;
                        nuevanotacredad.notacredad_nro = numeroNC;
                        nuevanotacredad.va_id = idvta;
                        nuevanotacredad.notacredad_estado = Estado.Emitida;
                        foreach (DataGridViewRow filaad in dgvListaArt.Rows)
                        {
                            LineaNotaCreditoA nuevalineancad = new LineaNotaCreditoA();
                            nuevalineancad.art_id = (int)filaad.Cells["art_id"].Value;
                            int idarticulo = (int)filaad.Cells["art_id"].Value;
                            nuevalineancad.cantidad = (int)filaad.Cells["cantidad"].Value;
                            int artcant = (int)filaad.Cells["cantidad"].Value;
                            nuevalineancad.precio_unitario = (decimal)filaad.Cells["precio_bonificado"].Value;
                            nuevanotacredad.LineaNotaCreditoA.Add(nuevalineancad);
                            //Actualizar stock de cada articulo
                            ActualizarStock(idarticulo, artcant);
                        }
                        nuevanotacredad.notacredad_subtotal = subtotal;
                        nuevanotacredad.notacredad_descuento = descuento;
                        nuevanotacredad.notacredad_iva = iva;
                        context.NotasCreditoAd.AddObject(nuevanotacredad);
                        context.SaveChanges();
                        NotaCredAdPrint = nuevanotacredad;
                    }
                    else
                        if (NC == true) // nota credito
                        {
                            //Registrar ultimo numero de nota de credito usado
                            var auth = context.Autorizaciones.FirstOrDefault(a => a.autorizacion_id == autorizacionId);
                            auth.autorizacion_ultimo_numero = Convert.ToInt32(txbNotaCreditoNumero.Text.Replace(" ", "").Replace("-", ""));
                            // busco la venta relacionada para imprimir el nro de factura y tipofact
                            Ventas fact = context.Ventas.FirstOrDefault(fac => fac.id_venta == idvta);
                            NumeroComprPrint = fact.venta_nro_inicio;
                            TipoComprPrint = fact.venta_tipo_comprobante;
                          
                            //Registrar la nueva nota de credito
                            NotasCredito nuevanotacred = new NotasCredito();

                            nuevanotacred.notacred_fecha = fechaActual;
                            nuevanotacred.notacred_nro = numeroNC;
                            nuevanotacred.id_venta = idvta;
                            nuevanotacred.notacred_estado = Estado.Emitida;

                            foreach (DataGridViewRow fila in dgvListaArt.Rows)
                            {
                                LineaNotaCredito nuevalineanc = new LineaNotaCredito();
                                nuevalineanc.art_id = (int)fila.Cells["art_id"].Value;
                                int idarticulo = (int)fila.Cells["art_id"].Value;
                                nuevalineanc.cantidad = (int)fila.Cells["cantidad"].Value;
                                int artcant = (int)fila.Cells["cantidad"].Value;
                                nuevalineanc.precio_venta = (decimal)fila.Cells["precio_bonificado"].Value;
                                nuevanotacred.LineaNotaCredito.Add(nuevalineanc);
                                //Actualizar stock de cada articulo
                                ActualizarStock(idarticulo, artcant);
                            }

                            nuevanotacred.notacred_subtotal = subtotal;
                            nuevanotacred.notacred_descuento = descuento;
                            nuevanotacred.notacred_iva = iva;

                            context.NotasCredito.AddObject(nuevanotacred);
                            context.SaveChanges();
                            NotaCredPrint = nuevanotacred;
                        }
                    MessageBox.Show("Comprobante Generado Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    notacred = false;
                    notacredAd = false;

                    DialogResult dr = MessageBox.Show("¿Desea Imprimir este Comprobante?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (dr == System.Windows.Forms.DialogResult.Yes)
                    {
                        ImprimirNotaCred();
                    }
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Error");
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }

        private void ImprimirNotaCred()
        {
            PDocNC.PrinterSettings.Copies = 3;
            printDialogNc.Document = PDocNC;
            
            DialogResult resultadounico = printDialogNc.ShowDialog();

            if (resultadounico == DialogResult.OK)
            {
                printPrevDNC.Document = PDocNC;
                ((Form)printPrevDNC).WindowState = FormWindowState.Maximized;
                printPrevDNC.ShowDialog();
            }
        }

        private void PDocNC_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            decimal total;
            decimal descuento;
            decimal subtotaldesc;
            decimal montoiva;
            string ncnumeroprint;
            decimal porcentajedesc;

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            string fecha = fechaActual.ToString("dd/MM/yyyy");
            e.Graphics.DrawString("Fecha:", printFontTit, Brushes.Black, 500, 75);
            e.Graphics.DrawString(fecha, printFontTit, Brushes.Black, 570, 75);

            String ComprRelac = TipoComprPrint.ToString() + NumeroComprPrint.ToString("0000-00000000");
            e.Graphics.DrawString(ComprRelac.ToString(), printFontNormal10, Brushes.Black, 690, 170);
            e.Graphics.DrawString("Comprobante:", printFontNormal10, Brushes.Black, 645, 170, formato);
            int desnivel = 40;

            if (NC == true)//notacredito
            {
                ncnumeroprint = numeroNC.ToString("0000-00000000");
                e.Graphics.DrawString((ncnumeroprint.Substring(5, 8)), miniprintFont, Brushes.Black, 585, 63);

                //notacred = false;
                e.Graphics.DrawString(NotaCredPrint.Ventas.Clientes.cliente_nombre, printFontNormal10, Brushes.Black, 130, 130 + desnivel);
                e.Graphics.DrawString(NotaCredPrint.Ventas.Clientes.cliente_direccion, printFontNormal10, Brushes.Black, 130, 150 + desnivel);
                e.Graphics.DrawString(NotaCredPrint.Ventas.Clientes.cliente_localidad, printFontNormal10, Brushes.Black, 500,  150 + desnivel);
                e.Graphics.DrawString(NotaCredPrint.Ventas.Clientes.CondicionIVA.condicion_sigla, printFontNormal10, Brushes.Black, 130, 170 + desnivel);
                e.Graphics.DrawString(NotaCredPrint.Ventas.Clientes.cliente_cuit, printFontNormal10, Brushes.Black, 485, 170 + desnivel);
               
                total = Math.Round((Convert.ToDecimal(NotaCredPrint.notacred_monto)), 2);
                descuento = Math.Round(Convert.ToDecimal((NotaCredPrint.notacred_subtotal) - (NotaCredPrint.notacred_monto - NotaCredPrint.notacred_iva)), 2);
                subtotaldesc = Math.Round(Convert.ToDecimal((NotaCredPrint.notacred_subtotal) - (descuento)), 2);
              
                montoiva = NotaCredPrint.notacred_iva;
                porcentajedesc = NotaCredPrint.notacred_descuento;
                
               }
            else
               
               {//notacredadicional
                   e.Graphics.DrawString("Documento No Valido Como Factura", printFontTit, Brushes.Black, 310, 20);
                   e.Graphics.DrawString(" Nota de Credito X ", printFontTit, Brushes.Black, 365, 7);

                   string comprobnumero = numeroNCAdic.ToString("0000-00000000");
                   e.Graphics.DrawString(comprobnumero, printFontTit, Brushes.Black, 550, 40);
                   e.Graphics.DrawString("Número:", printFontTit, Brushes.Black, 520, 40, formato);

                   e.Graphics.DrawLine(Pens.Black, 10, 120 +desnivel, 800, 120 + desnivel);
                   e.Graphics.DrawLine(Pens.Black, 10, 200 + desnivel, 800, 200 + desnivel);
                   e.Graphics.DrawLine(Pens.Black, 10, 980, 825, 980);

                   //notacredad = false;
                   ncnumeroprint = numeroNCAdic.ToString("00000000");
                   e.Graphics.DrawString(NotaCredAdPrint.VentasAdicionales.Clientes.cliente_nombre, printFontNormal10, Brushes.Black,130, 130 + desnivel);
                   e.Graphics.DrawString(NotaCredAdPrint.VentasAdicionales.Clientes.cliente_direccion, printFontNormal10, Brushes.Black, 130,150 + desnivel);
                   e.Graphics.DrawString(NotaCredAdPrint.VentasAdicionales.Clientes.cliente_localidad, printFontNormal10, Brushes.Black, 500,150 + desnivel);
                   e.Graphics.DrawString(NotaCredAdPrint.VentasAdicionales.Clientes.CondicionIVA.condicion_sigla, printFontNormal10, Brushes.Black,130,170 + desnivel);
                   e.Graphics.DrawString(NotaCredAdPrint.VentasAdicionales.Clientes.cliente_cuit, printFontNormal10, Brushes.Black, 485, 170 + desnivel);
                   
                    porcentajedesc = NotaCredAdPrint.notacredad_descuento;
                    total = Math.Round((Convert.ToDecimal(NotaCredAdPrint.notacredad_monto)), 2);
                    descuento = Math.Round(Convert.ToDecimal((NotaCredAdPrint.notacredad_subtotal) - (NotaCredAdPrint.notacredad_monto - NotaCredAdPrint.notacredad_iva)), 2);
                    subtotaldesc = Math.Round(Convert.ToDecimal((NotaCredAdPrint.notacredad_subtotal) - (descuento)), 2);
                    montoiva = NotaCredAdPrint.notacredad_iva;
               }

      
            e.Graphics.DrawString("Cliente:", printFont, Brushes.Black, 90, 130 + desnivel, formato);
            e.Graphics.DrawString("Dirección:", printFont, Brushes.Black, 80, 150 + desnivel, formato);
            e.Graphics.DrawString("Localidad:", printFont, Brushes.Black, 450, 150 + desnivel, formato);
            e.Graphics.DrawString("Cond. IVA:", printFont, Brushes.Black, 80, 170 + desnivel, formato);
            e.Graphics.DrawString("CUIT:", printFont, Brushes.Black, 470, 170 + desnivel, formato);

            int lineainencabezado = 205 + desnivel;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFontNormal10, Brushes.Black, 24, lineainencabezado);
            String Cod = "Codigo";
            e.Graphics.DrawString(Cod, printFont, Brushes.Black, 83, lineainencabezado + 3);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFontNormal10, Brushes.Black, 315, lineainencabezado);
            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFontNormal10, Brushes.Black, 575, lineainencabezado);
            String Bonif = "Bonif.";
            e.Graphics.DrawString(Bonif, printFontNormal10, Brushes.Black, 635, lineainencabezado);
            String PrecioOf = "Precio Bon";
            e.Graphics.DrawString(PrecioOf, printFontNormal10, Brushes.Black, 675, lineainencabezado);
            String Importe = "Total";
            e.Graphics.DrawString(Importe, printFontNormal10, Brushes.Black, 757, lineainencabezado);

            //Proceso de dibujado de las lineas de factura
            int posY = 225 + desnivel;
            int anchoLinea = 20;
            int posCantidad = margenX + 15;
            int posCod = posCantidad + 42;
            int posArticulo = posCod + 55;
            int posPrecioU = posArticulo + 440;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 51;
            int posPrecioT = posPrecioOf + 62;

            foreach (DataGridViewRow fila in dgvListaArt.Rows)
                    {
                       int artcant = (int)fila.Cells["cantidad"].Value;
                       e.Graphics.DrawString(artcant.ToString(), printFontNormal10, Brushes.Black, posCantidad, posY);
                       //int artcodigo = (int)fila.Cells["art_codigo"].Value;
                       //e.Graphics.DrawString(artcodigo.ToString(), printFont, Brushes.Black, posCod, posY + 3);

                       string nombreart = (string)fila.Cells["art_nombre"].Value;
                       e.Graphics.DrawString(nombreart.ToString(), printFontNormal10, Brushes.Black, posArticulo, posY);

                      decimal preciou = (decimal)fila.Cells["precio_unitario"].Value;
                      e.Graphics.DrawString(preciou.ToString(), printFontNormal10, Brushes.Black, posPrecioU, posY);

                      decimal ofertadesc = (decimal)fila.Cells["oferta_descuento"].Value;
                      if (ofertadesc > 0)
                      {
                          string nuevobon = ofertadesc.ToString("0.00 %");
                          e.Graphics.DrawString(nuevobon.ToString(), printFontNormal10, Brushes.Black, posBonif, posY);
                      }
                      decimal preciobonif = (decimal)fila.Cells["precio_bonificado"].Value;
                      e.Graphics.DrawString(preciobonif.ToString(), printFontNormal10, Brushes.Black, posPrecioOf, posY);

                      decimal preciof = (decimal)fila.Cells["precio_final"].Value;
                      e.Graphics.DrawString(preciof.ToString(), printFontNormal10, Brushes.Black, posPrecioT, posY);
                        
                posY += anchoLinea;
                 }
            int lineafin = 995;
            int lineafinletrachica = 997;
            int posSubtotX = 22;
            
            String subtot = "SUB-TOT $";
            e.Graphics.DrawString(subtot, printFontNormal10, Brushes.Black, posSubtotX + 8, lineafinletrachica);
            e.Graphics.DrawString(Convert.ToString(subtotal), printFontNormal10, Brushes.Black, posSubtotX + 81, lineafinletrachica);

            String desc = "DESC $";
            e.Graphics.DrawString(desc, printFontNormal10, Brushes.Black, posSubtotX + 160, lineafinletrachica);
           
            e.Graphics.DrawString(Convert.ToString(descuento), printFontNormal10, Brushes.Black, posSubtotX + 242, lineafinletrachica);
            e.Graphics.DrawString(porcentajedesc.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 209, lineafinletrachica + 4);
            String subtotdesc = "SUB-TOT Desc $";
            e.Graphics.DrawString(subtotdesc, printFontNormal10, Brushes.Black, posSubtotX + 313, lineafinletrachica);
            e.Graphics.DrawString(Convert.ToString(subtotaldesc), printFontNormal10, Brushes.Black, posSubtotX + 418, lineafinletrachica);

            String iva = "IVA $";
            e.Graphics.DrawString(iva, printFontTit, Brushes.Black, posSubtotX + 500, lineafin);
            e.Graphics.DrawString(Convert.ToString(montoiva), printFontTit, Brushes.Black, posSubtotX + 550, lineafin);

            String tot = "TOTAL $";
            e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 627, lineafin);
            e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 702, lineafin);
    }

       
  }
}
